package picol.model.asa.expr;

import picol.model.jjgener.Token;

/**
 * Classe abstraite de gestion des expressions
 * Représente une expression sous la forme d'un arbre de syntaxe abstraite (ASA)
 * @author Aurélien Marcel - Julien Sanderson
 */
public abstract class ASAExpr {

    /**
     * Access au premier fils
     * @return le premier fils
     */
    public ASAExpr getExpr1() {
        return null;
    }

    /**
     * Access au second fils.
     * @return le second fils.
     */
    public ASAExpr getExpr2() {
        return null;
    }

    /**
     * Accès à la valeur entière.
     * @return la valeur entière.
     */
    public int getValeur() {
        return -1;
    }

    /**
     * Access au token de l'expression fils.
     * @return le token.
     */
    public Token getToken() {
        return null;
    }

    /**
     * Methode pour evaluer l'expression devant être définie dans chaque classe fille
     * L'évaluation se fait récursivement en parcourant l'arbre
     * @return
     */
    public int evalue() {
        return -1;
    }

    /**
     * Méthode devant être définie dans chaque classe fille
     * @return la chaine pour la notation explorateur
     */
    public abstract String getLabelExplorateur();

    /**
     * Calcule la notation explorateur de l'ASA.
     * @return la chaine contenant la notation explorateur.
     */
    public String notationExplorateur() {
        return notationExplorateur("");
    }

    /**
     * Calcule la notation explorateur de l'ASA.
     * @return la chaine contenant la notation explorateur.
     */
    private String notationExplorateur(String prefixe) {
        String res = prefixe + getLabelExplorateur() + "\n";
        String prefixeSuiv = prefixe + "   ";
        ASAExpr expr1 = getExpr1();
        ASAExpr expr2 = getExpr2();
        if (expr1 != null) {
            res += expr1.notationExplorateur(prefixeSuiv);
        }
        if (expr2 != null) {
            res += expr2.notationExplorateur(prefixeSuiv);
        }
        return res;
    }

    /**
     * Methode pour simplifier l'expression devant être définie dans chaque classe fille
     * La simplification se fait récursivement en parcourant l'arbre
     * @return l'expression simplifiée
     */
    public ASAExpr simplifie() {
        return this;
    }
}
